/**
 * @param {string} s
 * @param {string} t
 * @return {number}
 */
 var numDistinct = function(s, t) {
    // dp[i][j] 表示以i-1为结尾的字符串其中包含以j-1位结尾的字符串的出现的个数
    let dp = new Array(s.length+1).fill(0).map(()=>new Array(t.length+1).fill(0))
    // 初始化 dp[0][0] 就是两个都是空字符串 name相等的就是1  dp[i][0] 就是代表i是字符串 删掉几个里面空字符串子集的个数 就是1 dp[0][j] 表示一个空字符串其中删掉元素能有有元素的子集 就是0
    for(let i = 0;i < s.length;i++){
      // 从头到尾遍历s的长度 就是i 让dp[i][0] = 1
      dp[i][0] = 1
    }
    for(let i = 1;i <= s.length;i++){
      for(let j = 1;j <= t.length;j++){
        if(s[i-1] === t[j-1]){
          // 如果i-1位置的字母 和 j-1位置的字母相同 那么以i-1位结尾的字符串中以j-1位结尾的字符串出现的次数就是 以i-2位结尾的字符串中以j-2位结尾的字符串出现的次数 和 以i-2位结尾的字符串中以j-1位结尾的字符串出现的次数
          dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
        }else{
          dp[i][j] = dp[i-1][j] // 如果两个数字字母不相等的话 那么以i-1位结尾的字符串中以j-1位结尾的字符串出现的次数就是 以i-2位结尾的字符串中以j-1位结尾的字符串出现的次数
        }
      }
    }
    return dp[s.length][t.length] // 最后返回以s最后一个字符为结尾的字符串中以t的最后一个字符串出现的次数
};